"""
类与对象的概念：
类是一个抽象的，不存在的具体实物
1、比如说空调，就可以是一个类，格力空调就是具体存在的对象
2、人类是一个抽象，但是刘超就是人类具体存在的实例
"""
# 类的关键字：class
# 创建了一个学生类
class Student:      # 类名字首字母要大写，这个是命名规范
    # 所有双下划线的，在类里面都叫做：魔术方法
    def __init__(self,name,age,address):        # __init__初始化方法，所有实例的对象都需要带有这些属性
        """
        self：表示类对象本身，对象/实例
        :param name: 学生的姓名
        :param age: 学生年龄
        :param address: 学生地址
        """
        self.name = name        # 类里面，需要将传递过来的实例属性全局，加上self后面的函数才可以找到它并使用
        self.age = age
        self.address = address
    # 自定义的函数：类方法 /类函数
    def info(self):     # 所有方法都会默认带上self的参数
        print(self)     # self表示对象本身，直接打印会是对象的地址值
        print(f"大家好，我叫做：{self.name}，今年：{self.age}岁，来自：{self.address}")

# 主程序入口，所有的代码都会在这里执行
"""
if __name__ == '__main__':
    # 通过Student类创建实例对象：s1
    s1 = Student(name='张三',age=19,address='辽宁')
    # 通过类对象，来去调用类方法
    s1.info()       # 大家好，我叫做：张三，今年：19岁，来自：辽宁
    # 通过Student类创建实力对象：s2
    s2 = Student("刘超",age=41,address='辽宁')
    # 通过s2对象，来去调用类方法
    s2.info()
"""

# 创建一个工具类
class Tools:
    address = '辽宁'  # 类属性：归属于类，类可以调用；对象也可以调用
    def __init__(self,name):        # __init__方法里的是实例属性：归属于对象， 仅能对象来调用、赋值
        self.name = name        # tool工具的名字
    def work(self):
        print(f"使用：{self.name} 去 {self.address} 工作")
# 主程序入口
if __name__ == '__main__':
    # 通过Tools类创建对象
    t1 = Tools("镰刀")
    t2 = Tools("斧头")
    # 调用工作方法
    # t1.work()

    # todo：【类属性】
    # 通过类来去调用类属性：查
    # print(Tools.address)
    # 通过类对象来去调用类属性：查
    # print(t1.address)

    # 类来修改类属性
    # Tools.address = "黑龙江"
    # print(Tools.address)        # 使用类来查看类属性
    # print(t1.address)           # 使用对象来查看类属性
    # 对象来修改类属性
    # t1.address = '吉林'
    # print(Tools.address)        # 使用类来查看修改后的：类属性；辽宁
    # print(t1.address)           # 使用对象来查看修改后的：类属性；吉林
    # 类属性只能通过类来修改，对象修改相当于是给自己增加了一个实例属性
    # print(t1.__dict__)      # 查看t1对象自己的实例属性：{'name': '镰刀', 'address': '吉林'}

    #类来删除类属性
    # del Tools.address
    # print(Tools.address)        # 报错，不存在这个
    # print(t1.address)           # 报错，不存在这个
    # 对象来删除类属性
    # t1.address = "乌鲁木齐"
    # del t1.address      # AttributeError: address，对象是没有这个实例属性，无法删除
    # print(Tools.address)
    # print(t1.address)

    # 类属性和实例属性有重复的
    # t1.address = "黑龙江"      # t1.address 就是为t1对象单独加了一个实例属性
    # print(t1.address)       # 优先级： 实例属性自己有的 》 类属性
    # print(t1.__dict__)      # 查看是否有加成功
    # print(t2.address)       # 辽宁

    # todo：【实例属性】
    # 实例属性新增
    # t1.phone_number = "12786781123"
    # print(t1.phone_number)
    # print(t1.__dict__)

    # 实例属性修改
    # t1.name = "菜刀"  # 重新赋值，如果存在则是修改，不存在则是新增
    # print(t1.name)

    # 实例属性删除
    # del t1.name    # 删除t1对象的name属性
    # print(t1.name)

    # 实例属性的访问
    # print(t1.name)
    # print(Tools.name)       # 无法直接访问到对象实例属性，可以理解为实例属性是独有的，类没办法访问

    # 类方法的调用
    # t1.work()     # 通过实例化的对象调用类方法
    Tools.work(t1)        # 通过类来调用类方法
